/**
 * VSCode Rsync部署插件类型定义
 * 定义插件中使用的所有接口和类型
 * 
 * @author lihengtt <lihengsir@gmail.com>
 * @github https://github.com/lihengtt
 */

import * as vscode from 'vscode';

/**
 * 服务器连接信息接口
 */
export interface ServerInfo {
    /** 服务器主机地址 */
    host: string;
    /** SSH端口号，默认22 */
    port: number;
    /** 用户名 */
    username: string;
    /** 密码（可选，建议使用密钥认证） */
    password?: string;
    /** 私钥文件路径（可选） */
    privateKeyPath?: string;
    /** 私钥密码（可选） */
    passphrase?: string;
}

/**
 * Rsync配置接口
 */
export interface RsyncConfig {
    /** 服务器连接信息 */
    serverInfo: ServerInfo;
    /** 本地项目根目录 */
    localPath: string;
    /** 远程目录路径 */
    remotePath: string;
    /** 排除的文件和目录模式 */
    excludePatterns: string[];
    /** 是否启用自动同步 */
    autoSync: boolean;
    /** 同步延迟时间（毫秒） */
    syncDelay: number;
    /** 是否删除远程多余文件 */
    deleteRemote: boolean;
    /** 是否保持文件权限 */
    preservePermissions: boolean;
    /** 是否压缩传输 */
    compress: boolean;
    /** 额外的rsync参数 */
    extraArgs: string[];
}

/**
 * 远程文件信息接口
 */
export interface RemoteFile {
    /** 文件名 */
    name: string;
    /** 完整路径 */
    path: string;
    /** 是否为目录 */
    isDirectory: boolean;
    /** 文件大小（字节） */
    size: number;
    /** 文件权限 */
    permissions: string;
    /** 修改时间 */
    modifiedTime: Date;
    /** 所有者 */
    owner: string;
    /** 所属组 */
    group: string;
}

/**
 * 远程文件操作结果接口
 */
export interface RemoteFileResult {
    /** 操作是否成功 */
    success: boolean;
    /** 文件列表（获取文件列表时使用） */
    files?: RemoteFile[];
    /** 当前路径 */
    currentPath?: string;
    /** 错误信息 */
    error?: string;
    /** 详细错误信息 */
    details?: string;
}

/**
 * 同步操作结果接口
 */
export interface SyncResult {
    /** 操作是否成功 */
    success: boolean;
    /** 本地文件路径 */
    localPath: string;
    /** 远程文件路径 */
    remotePath: string;
    /** 操作类型 */
    operation: 'upload' | 'download' | 'delete';
    /** 传输的字节数 */
    bytesTransferred?: number;
    /** 传输耗时（毫秒） */
    duration?: number;
    /** 错误信息 */
    error?: string;
    /** rsync命令输出 */
    output?: string;
}

/**
 * 文件变化事件接口
 */
export interface FileChangeEvent {
    /** 变化类型 */
    type: 'created' | 'modified' | 'deleted';
    /** 文件路径 */
    path: string;
    /** 是否为目录 */
    isDirectory: boolean;
    /** 变化时间 */
    timestamp: Date;
}

/**
 * 同步队列项接口
 */
export interface SyncQueueItem {
    /** 唯一标识 */
    id: string;
    /** 本地文件路径 */
    localPath: string;
    /** 远程文件路径 */
    remotePath: string;
    /** 操作类型 */
    operation: 'upload' | 'download' | 'delete';
    /** 优先级 */
    priority: number;
    /** 创建时间 */
    createdAt: Date;
    /** 重试次数 */
    retryCount: number;
}

/**
 * WebView消息接口
 */
export interface WebViewMessage {
    /** 命令类型 */
    command: string;
    /** 消息数据 */
    data?: any;
    /** 请求ID（用于响应匹配） */
    requestId?: string;
}

/**
 * 配置更新消息
 */
export interface ConfigUpdateMessage extends WebViewMessage {
    command: 'updateConfig';
    data: {
        config: RsyncConfig | null;
        hasConfig: boolean;
        isWatching: boolean;
    };
}

/**
 * 文件列表更新消息
 */
export interface FilesUpdateMessage extends WebViewMessage {
    command: 'updateFiles';
    data: {
        files: RemoteFile[];
        currentPath: string;
        success: boolean;
        error?: string;
    };
}

/**
 * 操作结果消息
 */
export interface OperationResultMessage extends WebViewMessage {
    command: 'operationResult';
    data: {
        operation: string;
        success: boolean;
        message?: string;
        error?: string;
        path?: string;
    };
}

/**
 * 插件状态接口
 */
export interface PluginState {
    /** 是否已配置 */
    isConfigured: boolean;
    /** 是否正在监控文件变化 */
    isWatching: boolean;
    /** 当前配置 */
    config: RsyncConfig | null;
    /** 输出通道 */
    outputChannel: vscode.OutputChannel;
    /** WebView面板 */
    webviewPanel: vscode.WebviewPanel | null;
    /** 同步队列 */
    syncQueue: SyncQueueItem[];
    /** 最后同步时间 */
    lastSyncTime: Date | null;
}

/**
 * 命令执行选项接口
 */
export interface CommandOptions {
    /** 工作目录 */
    cwd?: string;
    /** 环境变量 */
    env?: { [key: string]: string };
    /** 超时时间（毫秒） */
    timeout?: number;
    /** 是否显示输出 */
    showOutput?: boolean;
    /** 输出编码 */
    encoding?: string;
}

/**
 * 命令执行结果接口
 */
export interface CommandResult {
    /** 退出码 */
    exitCode: number;
    /** 标准输出 */
    stdout: string;
    /** 标准错误输出 */
    stderr: string;
    /** 是否成功（退出码为0） */
    success: boolean;
    /** 执行耗时（毫秒） */
    duration: number;
    /** 错误信息 */
    error?: string;
}

/**
 * 进度报告接口
 */
export interface ProgressReport {
    /** 当前步骤 */
    step: string;
    /** 当前进度（0-100） */
    progress: number;
    /** 总步骤数 */
    totalSteps: number;
    /** 当前步骤索引 */
    currentStep: number;
    /** 是否可取消 */
    cancellable: boolean;
}

/**
 * 日志级别枚举
 */
export enum LogLevel {
    DEBUG = 'DEBUG',
    INFO = 'INFO',
    WARN = 'WARN',
    ERROR = 'ERROR'
}

/**
 * 日志条目接口
 */
export interface LogEntry {
    /** 日志级别 */
    level: LogLevel;
    /** 日志消息 */
    message: string;
    /** 时间戳 */
    timestamp: Date;
    /** 来源模块 */
    source?: string;
    /** 额外数据 */
    data?: any;
}

/**
 * 配置验证结果接口
 */
export interface ConfigValidationResult {
    /** 是否有效 */
    isValid: boolean;
    /** 错误信息列表 */
    errors: string[];
    /** 警告信息列表 */
    warnings: string[];
}

/**
 * 连接测试结果接口
 */
export interface ConnectionTestResult {
    /** 是否连接成功 */
    success: boolean;
    /** 响应时间（毫秒） */
    responseTime?: number;
    /** 服务器信息 */
    serverInfo?: {
        hostname: string;
        platform: string;
        version: string;
    };
    /** 错误信息 */
    error?: string;
}

/**
 * 文件统计信息接口
 */
export interface FileStats {
    /** 总文件数 */
    totalFiles: number;
    /** 总目录数 */
    totalDirectories: number;
    /** 总大小（字节） */
    totalSize: number;
    /** 最后修改时间 */
    lastModified: Date;
    /** 文件类型统计 */
    fileTypes: { [extension: string]: number };
}

/**
 * 同步统计信息接口
 */
export interface SyncStats {
    /** 上传文件数 */
    uploadedFiles: number;
    /** 下载文件数 */
    downloadedFiles: number;
    /** 删除文件数 */
    deletedFiles: number;
    /** 跳过文件数 */
    skippedFiles: number;
    /** 传输总字节数 */
    totalBytes: number;
    /** 总耗时（毫秒） */
    totalDuration: number;
    /** 平均传输速度（字节/秒） */
    averageSpeed: number;
}

/**
 * 插件设置接口
 */
export interface PluginSettings {
    /** 默认排除模式 */
    defaultExcludePatterns: string[];
    /** 默认同步延迟 */
    defaultSyncDelay: number;
    /** 最大重试次数 */
    maxRetryCount: number;
    /** 连接超时时间 */
    connectionTimeout: number;
    /** 是否启用详细日志 */
    enableVerboseLogging: boolean;
    /** 是否自动保存配置 */
    autoSaveConfig: boolean;
    /** WebView主题 */
    webviewTheme: 'light' | 'dark' | 'auto';
}

/**
 * 类型守卫函数
 */
export function isServerInfo(obj: any): obj is ServerInfo {
    return obj && typeof obj.host === 'string' && typeof obj.port === 'number' && typeof obj.username === 'string';
}

export function isRsyncConfig(obj: any): obj is RsyncConfig {
    return obj && isServerInfo(obj.serverInfo) && typeof obj.localPath === 'string' && typeof obj.remotePath === 'string';
}

export function isRemoteFile(obj: any): obj is RemoteFile {
    return obj && typeof obj.name === 'string' && typeof obj.path === 'string' && typeof obj.isDirectory === 'boolean';
}

export function isSyncResult(obj: any): obj is SyncResult {
    return obj && typeof obj.success === 'boolean' && typeof obj.localPath === 'string' && typeof obj.remotePath === 'string';
}

/**
 * 常量定义
 */
export const CONSTANTS = {
    /** 插件ID */
    EXTENSION_ID: 'vscode-rsync-deployment',
    /** 配置文件名 */
    CONFIG_FILE_NAME: '.rsync-config.json',
    /** 默认SSH端口 */
    DEFAULT_SSH_PORT: 22,
    /** 默认同步延迟（毫秒） */
    DEFAULT_SYNC_DELAY: 1000,
    /** 最大重试次数 */
    MAX_RETRY_COUNT: 3,
    /** 连接超时时间（毫秒） */
    CONNECTION_TIMEOUT: 30000,
    /** WebView视图类型 */
    WEBVIEW_VIEW_TYPE: 'rsyncDeployment.explorer',
    /** 输出通道名称 */
    OUTPUT_CHANNEL_NAME: 'Rsync Deployment'
} as const;